package fr.nts.application.novadmin.front.security.model;

import java.util.Collection;
import java.util.List;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;

import com.google.common.collect.Lists;

import fr.nts.application.novadmin.database.model.employe.NovadminEmployeSimple;
import fr.nts.application.novadmin.database.model.enumeration.NovadminDroit;
import fr.nts.framework.front.security.service.model.SimpleUserDetails;

/**
 * La classe définissant un utilisateur novadmin au sens spring security.
 *
 * @author sco
 * @version 1.0.0
 */
public class NovadminUserDetails extends SimpleUserDetails{

    private static final long serialVersionUID = 1L;

    /**
     * L'employé associé au compte
     */
    private NovadminEmployeSimple employe;
    
    
    /**
     * Représente un utilisateur NTS correctement authentifié pour la sécurité de l'application Novadmin.
     * 
     * @param ntsUserDetails Les caractéristiques de l'utilisateur
     * @throws IllegalArgumentException Mauvais paramètrage.
     */
    public NovadminUserDetails(SimpleUserDetails ntsUserDetails) throws IllegalArgumentException{
        super(ntsUserDetails.getUsername(),
              ntsUserDetails.isEnabled(), 
              ntsUserDetails.getAuthorities());
        setName(ntsUserDetails.getName());
        setFirstname(ntsUserDetails.getFirstname());
    }


    /*
     * (non-Javadoc)
     * @see fr.nts.framework.front.security.service.model.NTSUserDetails#toString()
     */
    @Override
    public String toString(){
        return new ToStringBuilder(this).appendSuper(super.toString())
                                        .append("employe", employe)
                                        .toString();
    }

    
    /*
     * (non-Javadoc)
     * @see org.springframework.security.core.userdetails.User#getAuthorities()
     */
    public Collection<GrantedAuthority> getAuthorities(){
    	List<GrantedAuthority> authorities = Lists.newArrayList();
    	authorities.addAll(super.getAuthorities());
    	
    	// Ajout des rôles secondaires
    	if(employe != null){
	    	authorities.add(new GrantedAuthorityImpl(employe.getRole().name()));
			
			for(NovadminDroit droit: employe.getDroits()){
				authorities.add(new GrantedAuthorityImpl(droit.name()));
			}
    	}
		
        return authorities;
    }
    
    
    // GETTER / SETTER
	public NovadminEmployeSimple getEmploye(){
		return employe;
	}

	public void setEmploye(NovadminEmployeSimple employe){
		this.employe = employe;
	}
}